package com.wash.shoes.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wash.shoes.annotation.DataPermission;
import com.wash.shoes.domain.dto.CheckOutDto;
import com.wash.shoes.domain.dto.MobileOrderListDto;
import com.wash.shoes.domain.dto.OrderPageListDto;
import com.wash.shoes.domain.dto.ShopStsXcxDto;
import com.wash.shoes.domain.vo.ItemTypeStatisVo;
import com.wash.shoes.domain.vo.OrderDetailVo;
import com.wash.shoes.domain.vo.OrderShoeNumVo;
import com.wash.shoes.domain.vo.StsOrderVo;
import com.wash.shoes.entity.OrderPo;
import com.wash.shoes.entity.SimpleCustomPhone;
import com.wash.shoes.entity.StatisticsSumPo;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * <p>
 * 洗护订单 Mapper 接口
 * </p>
 *
 * @author ljg
 * @since 2024-08-29
 */
public interface OrderMapper extends BaseMapper<OrderPo> {

    /**
     * @author lijianguo
     * @Date 29/08/2024 分页查询
     **/
    @DataPermission(type = "order", field = "shop_id", tableAlias = "os")
    List<OrderDetailVo> pageList(@Param("page") Page page, @Param("orderPo") OrderPageListDto orderPo,
                                 @Param("shopId") String shopId, @Param("userBindType") String userBindType);

    /**
     * 根据订单ID查询客户手机号码
     *
     * @param orderIds
     * @return
     */

    List<SimpleCustomPhone> getCustomPhone(@Param("orderIds") Set<String> orderIds);


    /**
     * @author lijianguo
     * @Date 03/09/2024 订单号
     **/
    OrderPo getByOrderNo(@Param("orderNo") String orderNo);

    /**
     * @author lijianguo
     * @Date 11/09/2024 请输入方法的简介
     **/
    List<OrderDetailVo> checkInList(@Param("page") Page page, @Param("searchString") String searchString,
                                    @Param("shopId") String shopId, @Param("userBindType") String userBindType, @Param("startTime") String startTime, @Param("endTime") String endTime);

    /**
     * @author lijianguo
     * @Date 11/09/2024 请输入方法的简介
     **/
    List<OrderDetailVo> checkOutList(@Param("page") Page page, @Param("shopId") String shopId,
                                     @Param("checkOutDto") CheckOutDto checkOutDto, @Param("userBindType") String userBindType);

    /**
     * @author lijianguo
     * @Date 11/09/2024 统计
     **/
    Integer orderCount(@Param("status") Integer status, @Param("comeFrom") String comeFrom,
                       @Param("beginDate") String beginDate, @Param("curShopId") String curShopId,
                       @Param("userBindType") String userBindType);

    /**
     * @author lijianguo
     * @Date 11/09/2024 统计订单数量以及鞋子数量
     **/
    StatisticsSumPo orderAndShoesCount(@Param("status") Integer status, @Param("comeFrom") String comeFrom,
                                       @Param("beginDate") String beginDate, @Param("curShopId") String curShopId,
                                       @Param("userBindType") String userBindType);

    /**
     * @author lijianguo
     * @Date 15/09/2024 请输入方法的简介
     **/
    Integer cancelByMtOrder(@Param("mtOrderId") String mtOrderId);

    /**
     * @author lijianguo
     * @Date 16/09/2024 请输入方法的简介
     **/
    OrderPo getByMtOrderId(@Param("mtOrderId") String mtOrderId);

    /**
     * 根据jd物流单号查询订单信息
     *
     * @param waybillCode
     * @return OrderPo
     */
    OrderPo getByJdWayBillCode(@Param("waybillCode") String waybillCode);

    /**
     * @author lijianguo
     * @Date 28/09/2024 请输入方法的简介
     **/
    Integer todayCheckInNum(@Param("shopId") String shopId, @Param("begin") Date begin, @Param("end") Date end, @Param("userBindType") String userBindType);

    /**
     * @author lijianguo
     * @Date 23/10/2024 请输入方法的简介
     **/
    List<OrderPo> sendShoeOrder(@Param("status") Integer status, @Param("time") String time);

    /**
     * @author lijianguo
     * @Date 23/10/2024 订单数量
     **/
    Integer getByPhone(@Param("phone") String phone, @Param("status") String status);

    /**
     * 查询用户的订单
     *
     * @param page
     * @param orderPo
     * @return
     */
    List<OrderDetailVo> userOrderList(@Param("page") Page page, @Param("orderPo") MobileOrderListDto orderPo);

    /**
     * 设置用户的信息
     *
     * @param phone
     * @param customerId
     */
    void updateOrderToUser(@Param("phone") String phone, @Param("customerId") String customerId);

    /**
     * @param
     * @return
     */
    Integer userOrderNum(@Param("status") String status, @Param("customerId") String customerId);

    /**
     * @return
     */
    List<OrderPo> getNotPayOrder();

    /**
     * @return
     */
    List<OrderPo> queryDyVerification();

    /**
     * @param comeFrom
     * @return
     */
    List<OrderPo> getOrderByComeFrom(@Param("comeFrom") String comeFrom);

    /**
     * 小程度的订单的状态
     *
     * @param status
     * @param customerId
     * @return
     */
    Integer userXcxOrderNum(@Param("status") String status, @Param("customerId") String customerId);

    /**
     * 通过顾客ID，顾客手机号码 小程序渠道查询客户订单
     *
     * @param customerId
     * @param customPhone
     * @return
     */
    List<OrderPo> queryOrderByCustomerIdAndStatus(@Param("customerId") String customerId,
                                                  @Param("customPhone") String customPhone);

    /**
     * @param searchInfo
     * @return
     */
    OrderPo getLastByPhone(@Param("searchInfo") String searchInfo);

    /**
     * 推送店铺不为空,而且,订单的状态为清洗中的
     *
     * @return
     */
    List<OrderPo> needPushOrder();

    /**
     * 查询mt的订单
     *
     * @return
     */
    List<OrderPo> getMtNotFullFillOrderList();

    /**
     * @param shopStsXcxDto
     * @param shopIdStr
     * @return 订单的金额
     */
    Double orderMoneySts(@Param("shopStsXcxDto") ShopStsXcxDto shopStsXcxDto, @Param("shopIdStr") String shopIdStr, @Param("userBindType") String userBindType);

    /**
     * 统计每天的数量
     *
     * @param shopStsXcxDto
     * @param shopIdStr
     * @return
     */
    List<StsOrderVo> orderMoneyDaySts(@Param("shopStsXcxDto") ShopStsXcxDto shopStsXcxDto,
                                      @Param("shopIdStr") String shopIdStr, @Param("userBindType") String userBindType);


    /**
     * 按物品类型统计
     *
     * @param shopStsXcxDto
     * @param shopIdStr
     * @param userBindType
     */
    List<ItemTypeStatisVo> selectStatisByItemType(@Param("shopStsXcxDto") ShopStsXcxDto shopStsXcxDto,
                                                  @Param("shopIdStr") String shopIdStr, @Param("userBindType") String userBindType);

    /**
     * 按日期统计物品类型
     *
     * @param shopStsXcxDto
     * @param shopIdStr
     * @param userBindType
     * @return
     */
    List<ItemTypeStatisVo> selectStatisByItemTypeWithDate(@Param("shopStsXcxDto") ShopStsXcxDto shopStsXcxDto,
                                                          @Param("shopIdStr") String shopIdStr, @Param("userBindType") String userBindType);

    /**
     * @param shopStsXcxDto
     * @param shopIdStr
     * @return 店铺的统计
     */
    List<StsOrderVo> orderMoneyShopSts(@Param("shopStsXcxDto") ShopStsXcxDto shopStsXcxDto,
                                       @Param("shopIdStr") String shopIdStr, @Param("userBindType") String userBindType);

    /**
     * @param shopStsXcxDto
     * @param shopIdStr
     * @return 每天的统计
     */
    List<StsOrderVo> orderWashShopDaySts(@Param("shopStsXcxDto") ShopStsXcxDto shopStsXcxDto,
                                         @Param("shopIdStr") String shopIdStr, @Param("userBindType") String userBindType);

    /**
     * @param shopStsXcxDto
     * @param shopIdStr
     * @return 工厂的统计
     */
    List<StsOrderVo> orderWashShopSts(@Param("shopStsXcxDto") ShopStsXcxDto shopStsXcxDto,
                                      @Param("shopIdStr") String shopIdStr, @Param("userBindType") String userBindType);

    /**
     * @param shopStsXcxDto
     * @param shopIdStr
     * @return
     */
    List<StsOrderVo> orderWashShoeShoeDaySts(@Param("shopStsXcxDto") ShopStsXcxDto shopStsXcxDto,
                                             @Param("shopIdStr") String shopIdStr, @Param("userBindType") String userBindType);

    /**
     * @param shopStsXcxDto
     * @param shopIdStr
     * @return 统计数量
     */
    List<StsOrderVo> orderWashShoeShopDaySts(@Param("shopStsXcxDto") ShopStsXcxDto shopStsXcxDto,
                                             @Param("shopIdStr") String shopIdStr, @Param("userBindType") String userBindType);

    /**
     * @param page
     * @param shopStsXcxDto
     * @return 用户的推广的订单
     */
    List<OrderDetailVo> recommendPageList(@Param("page") Page<OrderDetailVo> page,
                                          @Param("shopStsXcxDto") ShopStsXcxDto shopStsXcxDto);

    /**
     * 查询当天的订单的鞋子数量
     *
     * @param date 日期
     * @return 返回对应日期的各订单的鞋子数量
     */
    List<OrderShoeNumVo> getOrderShoeNum(@Param("date") String date);
}
